#include <stdio.h>
#include <limits.h>
#include "helper.h"

/* Print the binary of word w -- assuming 1byte=8bits. */
void print_binword(uword w) {
   int i;
   for(i=0;i<sizeof(w)*CHAR_BIT;i++) {
      printf("%d",(w&1)?1:0);
      w>>=1;
   }
}

/* Macro to define functions which print out the registers of the cipher */
#define mickey_print_def(array, len)            \
void mickey_print_##array(mickey_state *ctx) {  \
   int i;                                       \
   for(i=0;i<len;i++) {                         \
      printf("%s[%2d] = ",#array,i);            \
      print_binword(ctx->array[i]);             \
      printf("\n");                             \
   }                                            \
}                                               

void mickey_print_R(mickey_state *ctx) {
   int i,pos=ctx->R0_pos;
   for(i=0;i<100;i++) {
      printf("R[%2d] = ",i);
      print_binword(ctx->R[pos]);
      printf("\n");
      pos++; if(pos==100) { pos=0;}
   }
}                                               

mickey_print_def(S, 100);
mickey_print_def(keys, 80);
mickey_print_def(IVs, 80);

void ECRYPT_print_R(ECRYPT_ctx *ctx) {
   int i;
   for(i=0;i<4;i++) {
      int j;
      u32 w=ctx->R[i];
      for(j=0;j<sizeof(w)*8;j++) {
         if( (i*(sizeof(w)*8)+j)>=100) break;
         printf("R[%2lu] = %d\n",i*(sizeof(w)*8)+j,(w&1)?1:0);
         w>>=1;
      }
   }
}

void ECRYPT_print_S(ECRYPT_ctx *ctx) {
   int i;
   for(i=0;i<4;i++) {
      int j;
      u32 w=ctx->S[i];
      for(j=0;j<sizeof(w)*8;j++) {
         if( (i*(sizeof(w)*8)+j)>=100) break;
         printf("S[%2lu] = %d\n",i*(sizeof(w)*8)+j,(w&1)?1:0);
         w>>=1;
      }
   }
}
